package Algorithm;

/**
 * @Desc:   用于计算二进制位数组中有多少个位是 1
 *          基于汉明算法
 * @author: cww
 * @DateTime: 2020-03-23 22:27
 */

public class HummingWeight {

    public static int intSwar(int i) {
        // 步骤1计算出的值i的二进制表示可以按每两个二进制位为一组进行分组，各组的十进制表示就是该组的汉明重量
        i = (i & 0x55555555) + ((i >> 1) & 0x55555555);
        // 步骤2计算出的值i的二进制表示可以按每四个二进制位为一组进行分组，各组的十进制表示就是该组的汉明重量
        i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
        // 步骤3计算出的值i的二进制表示可以按每八个二进制位为一组进行分组，各组的十进制表示就是该组的汉明重量
        i = (i & 0x0F0F0F0F) + ((i >> 4) & 0x0F0F0F0F);
        // 步骤4的i*0x01010101语句计算出bitarray的汉明重量并记录在二进制位的最高八位，
        // 而>>24语句则通过右移运算，将bitarray的汉明重量移动到最低八位，得出的结果就是bitarray的汉明重量
        i = (i*(0x01010101) >> 24);
        return i;
    }

    public static void main(String[] args) {
        String s = "hello";
        int h;
        int hash = (h = s.hashCode()) ^ (h >>> 16);

    }
}
